﻿<?php
/**
 * KindEditor PHP
 *
 * 本PHP程序是演示程序，建议不要直接在实际项目中使用。
 * 如果您确定直接使用本程序，使用之前请仔细确认相关安全设置。
 *
 */

require_once 'JSON.php';
$php_path = dirname(dirname(__FILE__)) . '/';
$php_url = dirname($_SERVER['PHP_SELF']) . '/';

//文件保存目录路径
$save_path = $php_path . '/upload/';
//文件保存目录URL
$save_url = str_replace('/editor','',$php_url) . '/upload/';
//定义允许上传的文件扩展名
$ext_arr = array(
	'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'),
	'flash' => array('swf', 'flv'),
	'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),
	'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2'),
);
//最大文件大小
$max_size = 1000000;

$save_path = realpath($save_path) . '/';

//PHP上传失败
if (!empty($_FILES['imgFile']['error'])) {
	switch($_FILES['imgFile']['error']){
		case '1':
			$error = '超过php.ini允许的大小。';
			break;
		case '2':
			$error = '超过表单允许的大小。';
			break;
		case '3':
			$error = '图片只有部分被上传。';
			break;
		case '4':
			$error = '请选择图片。';
			break;
		case '6':
			$error = '找不到临时目录。';
			break;
		case '7':
			$error = '写文件到硬盘出错。';
			break;
		case '8':
			$error = 'File upload stopped by extension。';
			break;
		case '999':
		default:
			$error = '未知错误。';
	}
	alert($error);
}

//有上传文件时
if (empty($_FILES) === false) {
	//原文件名
	$file_name = $_FILES['imgFile']['name'];
	//服务器上临时文件名
	$tmp_name = $_FILES['imgFile']['tmp_name'];
	//文件大小
	$file_size = $_FILES['imgFile']['size'];
	//检查文件名
	if (!$file_name) {
		alert("请选择文件。");
	}
	//检查目录
	if (@is_dir($save_path) === false) {
		alert("上传目录不存在。");
	}
	//检查目录写权限
	if (@is_writable($save_path) === false) {
		alert("上传目录没有写权限。");
	}
	//检查是否已上传
	if (@is_uploaded_file($tmp_name) === false) {
		alert("上传失败。");
	}
	//检查文件大小
	if ($file_size > $max_size) {
		alert("上传文件大小超过限制。");
	}
	//检查目录名
	$dir_name = empty($_GET['dir']) ? 'image' : trim($_GET['dir']);
	if (empty($ext_arr[$dir_name])) {
		alert("目录名不正确。");
	}
	//获得文件扩展名
	$temp_arr = explode(".", $file_name);
	$file_ext = array_pop($temp_arr);
	$file_ext = trim($file_ext);
	$file_ext = strtolower($file_ext);
	//检查扩展名
	if (in_array($file_ext, $ext_arr[$dir_name]) === false) {
		alert("上传文件扩展名是不允许的扩展名。\n只允许" . implode(",", $ext_arr[$dir_name]) . "格式。");
	}
	//创建文件夹
	if ($dir_name !== '') {
		$save_path .= $dir_name . "/";
		$save_url .= $dir_name . "/";
		if (!file_exists($save_path)) {
			mkdir($save_path);
		}
	}
	$ymd = date("Ymd");
	$save_path .= $ymd . "/";
	$save_url .= $ymd . "/";
	if (!file_exists($save_path)) {
		mkdir($save_path);
	}
	//新文件名
	$new_file_name = date("YmdHis") . '_' . rand(10000, 99999);
	$resize_file_name = $new_file_name;
	$new_file_name .=  '.' . $file_ext;
	//移动文件
	$file_path = $save_path . $new_file_name;
	$resize_file_path = $save_path . $resize_file_name;
	if (move_uploaded_file($tmp_name, $file_path) === false) {
		alert("上传文件失败。");
	}
	@chmod($file_path, 0644);
	$file_url = $save_url . $new_file_name;
	
	//剪切图片
	//包含剪切类
	/*
	require($php_path.'system/lib/imagecorp.lib.php');
	$resize_img = new ImageCrop($file_path);
	//$resize_img->SetSrcFile($file_path);
	$resize_img->Crop(375,375,4);
	$resize_img->SaveImage(($resize_file_path .'!375!375.' . $file_ext));
	
	$resize_img->Crop(205,205,4);
	$resize_img->SaveImage(($resize_file_path .'!205!205.' . $file_ext));
	
	$resize_img->Crop(110,110,4);
	$resize_img->SaveImage(($resize_file_path .'!110!110.' . $file_ext));
	
	$resize_img->Crop(42,42,4);
	$resize_img->SaveImage(($resize_file_path .'!42!42.' . $file_ext));
	*/
	//my_image_resize($file_path,($resize_file_path .'!375!375.' . $file_ext),375,375);
	//my_image_resize($file_path,($resize_file_path .'!205!205.' . $file_ext),205,205);
	//my_image_resize($file_path,($resize_file_path .'!110!110.' . $file_ext),110,110);
	
	header('Content-type: text/html; charset=UTF-8');
	$json = new Services_JSON();
	$file_url = str_replace('//','/',$file_url);
	echo $json->encode(array('error' => 0, 'url' => $file_url));
	exit;
}

function alert($msg) {
	header('Content-type: text/html; charset=UTF-8');
	$json = new Services_JSON();
	echo $json->encode(array('error' => 1, 'message' => $msg));
	exit;
}

/*
*说明：函数功能是把一个图像裁剪为任意大小的图像，图像不变形
* 参数说明：输入 需要处理图片的 文件名，生成新图片的保存文件名，生成新图片的宽，生成新图片的高
* written by smallchicken
* time 2008-12-18
*/
// 获得任意大小图像，不足地方拉伸，不产生变形，不留下空白
function my_image_resize($src_file, $dst_file , $new_width , $new_height) {
	if($new_width <1 || $new_height <1) {
		//echo "params width or height error !";
		//exit();
		return;
	}
	if(!file_exists($src_file)) {
		//echo $src_file . " is not exists !";
		//exit();
		return;
	}
	// 图像类型
	$type=exif_imagetype($src_file);
	$support_type=array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);
	if(!in_array($type, $support_type,true)) {
		//echo "this type of image does not support! only support jpg , gif or png";
		//exit();
		return;
	}
	//Load image
	switch($type) {
		case IMAGETYPE_JPEG :
			$src_img=imagecreatefromjpeg($src_file);
			break;
		case IMAGETYPE_PNG :
			$src_img=imagecreatefrompng($src_file);
			break;
		case IMAGETYPE_GIF :
			$src_img=imagecreatefromgif($src_file);
			break;
		default:
			//echo "Load image error!";
			//exit();
			return;
	}
	$w=imagesx($src_img);
	$h=imagesy($src_img);
	$ratio_w=1.0 * $new_width / $w;
	$ratio_h=1.0 * $new_height / $h;
	$ratio=1.0;
	// 生成的图像的高宽比原来的都小，或都大 ，原则是 取大比例放大，取大比例缩小（缩小的比例就比较小了）
	if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) {
		if($ratio_w < $ratio_h) {
			$ratio = $ratio_h ; // 情况一，宽度的比例比高度方向的小，按照高度的比例标准来裁剪或放大
		}else {
			$ratio = $ratio_w ;
		}
		// 定义一个中间的临时图像，该图像的宽高比 正好满足目标要求
		$inter_w=(int)($new_width / $ratio);
		$inter_h=(int) ($new_height / $ratio);
		$inter_img=imagecreatetruecolor($inter_w , $inter_h);
		imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h);
		// 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像
		// 定义一个新的图像
		$new_img=imagecreatetruecolor($new_width,$new_height);
		imagecopyresampled($new_img,$inter_img,0,0,0,0,$new_width,$new_height,$inter_w,$inter_h);
		switch($type) {
			case IMAGETYPE_JPEG :
			imagejpeg($new_img, $dst_file,60); // 存储图像
			break;
		case IMAGETYPE_PNG :
			imagepng($new_img,$dst_file,60);
			break;
		case IMAGETYPE_GIF :
			imagegif($new_img,$dst_file,60);
			break;
		default:
			break;
		}
	} // end if 1
	// 2 目标图像 的一个边大于原图，一个边小于原图 ，先放大平普图像，然后裁剪
	// =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) )
	else{
		$ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; //取比例大的那个值
		// 定义一个中间的大图像，该图像的高或宽和目标图像相等，然后对原图放大
		$inter_w=(int)($w * $ratio);
		$inter_h=(int) ($h * $ratio);
		$inter_img=imagecreatetruecolor($inter_w , $inter_h);
		//将原图缩放比例后裁剪
		imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h);
		// 定义一个新的图像
		$new_img=imagecreatetruecolor($new_width,$new_height);
		imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height);
		switch($type) {
			case IMAGETYPE_JPEG :
				imagejpeg($new_img, $dst_file,60); // 存储图像
				break;
			case IMAGETYPE_PNG :
				imagepng($new_img,$dst_file,60);
				break;
			case IMAGETYPE_GIF :
				imagegif($new_img,$dst_file,60);
				break;
			default:
				break;
		}
	}// if3
}// end function
